//泛型: 当封装函数, 或者定义接口的时候, 如果某个数据类型不确定, 可以使用泛型提升灵活性.
function fn4<T>(a: T, b: T): T {
  return ((a as any) + b) as any;
}
console.log(fn4<number>(5, 1)); // 6

// <> 相当于函数的参数，下面使用这个类型的时候相当于传参，传那种类型，泛型就是哪一种
interface str5<U, M> {
  name: U;
  tall: M;
}

// string 和 number 会传入上面的 U 和 M
let s5: str5<string, number> = {
  name: "新青年",
  tall: 175,
};
console.log(s5);  // {name: '新青年', tall: 175}


// 需求: 一个函数, 参数可以是字符串, 也可以是数值, 如果是数值就求和; 如果是字符串就拼接.
function getResult<T>(a: T, b: T): T {
  // return a as any + b as any;
  return <any>a + <any>b;   // <any>a断言的两种写法
}
console.log(getResult<number>(100, 200));
console.log(getResult<string>("小", "伙子"));

interface IMan<T, U> {
  name: T;
  age: U;
}
let man1: IMan<string, number> = {
  name: "123",
  age: 33,
};

